

/**
 * 判断权限的函数
 *
 *  参数 role
 *
 *      用法
 *      <button v-if="checkPermission(['editor'])">editor</button>
 *
 */
export function checkPermission(value) {
    if (value && value instanceof Array && value.length > 0) {
        const roles = ['add']
        const permissionRoles = value

        //判断传过来的权限,角色有没有相应权限
        const hasPermission = roles.some(role => {
            return permissionRoles.includes(role)
        })

        if (!hasPermission) {
            return false
        }
        return true
    } else {
        console.error(`need roles! Like v-permission="['admin','editor']"`)
        return false
    }
}


/*********************************************************************************************************************
 *
 * 简述：时间格式
 *
 * params:
 *   date: 时间 eg：new Date()
 *   fmt：格式  eg：yyyy-MM-dd HH:mm:ss  yyyy-MM-dd
 *
 * 使用
 *   eg: timeFormat(new Date(), "yyyy-MM-dd HH:mm:ss")
 *
 * */
export function timeFormat(date, fmt) {
    let o = {
        "M+": date.getMonth() + 1, //月份
        "d+": date.getDate(), //日
        "H+": date.getHours(), //小时
        "m+": date.getMinutes(), //分
        "s+": date.getSeconds(), //秒
        "q+": Math.floor((date.getMonth() + 3) / 3), //季度
        "S": date.getMilliseconds() //毫秒
    };
    if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
    for (let k in o)
        if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
    return fmt
}




/*********************************************************************************************************************
 *
 * 简述 增加和移除class
 *
 * params:
 *   element: dom
 *   className：新增class名
 *
 * 使用
 *   eg: toggleClass(document.body, 'add-remove-class')
 *
 * */

export function toggleClass(element, className) {
    if (!element || !className) {
        return
    }
    let classString = element.className
    const nameIndex = classString.indexOf(className)
    if (nameIndex === -1) {
        classString += '' + className
    } else {
        classString = classString.substr(0, nameIndex) + classString.substr(nameIndex + className.length)
    }
    element.className = classString
}



/*********************************************************************************************************************
 *
 * 数组对象的深拷贝
 *
 *     const arr = [{a:1,b:2},{a:2,b:3}]
 *     const newArr = ObjDeepCopy(arr)
 *
 *    对象的深拷贝 obj={a:1, b:2}  const newObj = Object.assign(Obj, {})
 *     数组的深拷贝 arr = [1,2,3]  const newArr = arr.slice(0)
 **/
export function ObjDeepCopy (source) {
    const sourceCopy = source instanceof Array ? [] : {};
    for (let item in source) {
        sourceCopy[item] = typeof source[item] === 'object' ? ObjDeepCopy(source[item]) : source[item]
    }
    return sourceCopy
}


/*********************************************************************************************************************
 *
 * 简述：制作空数组 生成一个从 start 到 end 的连续数组
 *
 * params:
 *   start: 开始数值
 *   end：结束数值
 *
 * 使用
 *   eg: generateArray(1, 4) ==> [1,2,3,4]
 *
 * */
export function generateArray (start, end) {
    return Array.from(new Array(end + 1).keys()).slice(start)
}





/*********************************************************************************************************************
 *
 * 简述：取出两个数组中不同部分
 *
 * params:
 *   arr1: 数组1
 *   arr2：数组2
 *
 * 使用
 *   eg: arr1 = [1,2,5] arr2 = [1,3,5,7]
 *       getArrDifference(arr1, arr2) ==> [3,7]
 *
 * */
export function getArrDifference(arr1, arr2) {
    return arr1.concat(arr2).filter(function(v, i, arr) {
        return arr.indexOf(v) === arr.lastIndexOf(v)
    })
}



/*********************************************************************************************************************
 *
 * 简述：数组按照指定规则排序
 *
 * 参数:
 *   array:  需要排序的数组
 *   params：数组中排序的参数
 *
 * 使用
 *   eg: array = [{id: 1, name: 'a'},{id: 3, name: 'b'},{id: 2, name: 'c'}]
 *       getSortArray(array, 'id') ==> [{id: 1, name: 'a'},{id: 2, name: 'c'},{id: 3, name: 'b'}]
 *
 *   array.sort((a,b)) 中a-b是升序   b-a是降序
 * */
export function getSortArray(array, params) {
    return array.sort((a,b)=>{
        return b[params] - a[params]
    })
}


/*********************************************************************************************************************
 *
 * 数组去重
 *
 * eg: var arr = [1, 2, 3, 4, 4, 5, 5]
 * distinct(arr, []) // [1, 2, 3, 4, 5]
 *
 **/
export function redeceReduplicativeArray(a, b) {
    return Array.from(new Set([...a, ...b]))
}



/*********************************************************************************************************************
 * 简述：数组对象按照指定属性去重
 *
 * 参数:
 *   array:  需要去重数组
 *   params：依据数组中去重的参数
 *
 * 使用
 *   eg: array = [{id: 1, name: 'a'},{id: 3, name: 'b'},{id: 2, name: 'c'}, ,{id: 4, name: 'a'}]
 *       redeceReduplicativeArrayObject(array, 'name') ==> [{id: 1, name: 'a'},{id: 2, name: 'c'},{id: 3, name: 'b'}]
 *
 * */
export function redeceReduplicativeArrayObject(array, params) {
    let obj = {}
    return array.reduce((item, next) => {
        obj[next[params]] ? '' : obj[next[params]] = true && item.push(next)
        return item
    }, [])
}


/*********************************************************************************************************************
 * @description 对数字进行隔三位加逗号
 *
 *  使用
 *     eg: splitFormatFun(10000000000) ==> 10,000,000,000
 */
export function splitFormatFun (val) {
    if (val) {
        let tmp = (val + '').split('').reverse()
        let out = []
        for (let i = 0; i < tmp.length; i++) {
            if (i % 3 === 0 && i !== 0) {
                out.push(',')
            }
            out.push(tmp[i])
        }
        return out.reverse().join('')
    } else {
        return '0'
    }
}


/*********************************************************************************************************************
 * @description hex 颜色值转换为 rgba值
 * @param       {string}   hex     eg: #000000
 * @param       {int}      opacity eg: 0.8
 * @return      {string}   rgba(0,0,0,0.8)
 */
export function hexToRgb (hex, opacity) {
    const shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i
    hex = hex.replace(shorthandRegex, function (m, r, g, b) {
        return r + r + g + g + b + b;
    })
    const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex)
    return result ? 'rgba(' + parseInt(result[1], 16) + ',' + parseInt(result[2], 16) + ',' + parseInt(result[3], 16) + ',' + opacity + ')' : 'rgba(0,0,0,0)'
}



/*********************************************************************************************************************
 * 日期相减得到相隔天数的函数
 *
 *  参数 date1：开始日期，date2结束日期
 *
 *      用法
 *      var a1="12-19-2018"; var a2="2019/1/7";
 *      var b=GetNumberOfDays(a1,a2)
 *      console.log(b);
 *
 */

export function GetNumberOfDays(date1,date2){//获得天数
    const a1 = Date.parse(new Date(date1));
    const a2 = Date.parse(new Date(date2));
    const day = parseInt((a2-a1)/ (1000 * 60 * 60 * 24));//核心：时间戳相减，然后除以天数
    return day
}

/*********************************************************************************************************************
 * 指定日期加上n天数得到新的日期
 *
 *  参数 appointedDate：指定日期，days 天数
 *
 *      用法
 *      var a1="12-19-2018"; var a2=5;
 *      var b=GetNewData(a1,a2)
 *      console.log(b);
 *
 */
export function GetNewData(appointedDate, days) {
    const dateTemp = appointedDate.split("-");
    const nDate = new Date(dateTemp[1] + '-' + dateTemp[2] + '-' + dateTemp[0]); //转换为MM-DD-YYYY格式
    const millSeconds = Math.abs(nDate) + (days * 24 * 60 * 60 * 1000);
    const rDate = new Date(millSeconds);
    const year = rDate.getFullYear();
    let month = rDate.getMonth() + 1;
    if (month < 10) month = "0" + month;
    let date = rDate.getDate();
    if (date < 10) date = "0" + date;
    return (year + "-" + month + "-" + date);
}

/*********************************************************************************************************************
 *  对象的属性于数组对应的属性,把对象的值添加到数组中
 *
 *  参数 array：指定日期，object 天数
 *
 *    用法
 *      var array = [{a: 1,b:2, c: 'age'}]
 *      var object = {age: 3}
 *      ArrayObjectDataAnalysis(array, object, 'c', 'age') => array = [{a: 1,b:2, c: 3}]
 *
 */
export function ArrayObjectDataAnalysis(array, object, argu1, argu2) {
    array.forEach(curr => {
        for (const item in object) {
            if (item === curr[argu1]) {
                curr[argu2] = object[item]
            }
        }
    })
}
